//内部类
class OuterClass {
    public int data1 = 1;
    int data2 = 2;
    public static int data3 = 3;

    public void test() {

        final int a = 10;//定义一个常量
        //a = 20; -- 这里已经不能够再修改了，类似于C语言中的const
        //只能初始化一次
        //定义成常量时一般是用大写的字母
        //常量是在程序编译的时候确立的

        System.out.println("OuterClass::test()");
    }

    /**
     * 实例内部类：
     * 1.怎样才能拿到实例内部类的对象呢？
     * 2.实例内部类当中，不能有静态的成员变量，如果非要定义，那么只能是被static final修饰的
     * 3.在实例内部类当中，如何访问外部类当中，相同的成员变量？
     *   ————在实例内部类当中获取外部类的this：OuterClass.this.data1
     *
     * 4.实例内部对象必须实例外部对象
     */

    //实例内部类
    class InnerClass {
        public int data1 = 111;
        public int data4 = 4;
        public int data5 = 5;

        public static final int data6 = 6;
        //final加上之后，这个地方的值相当于是一个常量
        //常量是在编译的时候就确定了是10
        //final是常量的意思

        //public static int data6; //error -- 错的

        public void func() {

            System.out.println("InnerClass::func()");

            //方法1:
            OuterClass outerClass = new OuterClass();
            System.out.println(outerClass.data1);

            //方法2:
            System.out.println(OuterClass.this.data1);

            System.out.println(data1);
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);


        }
    }
}

public class Test2 {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();

        //内部类实例化对象 -- 两种方法：
        OuterClass.InnerClass innerClass1 = outerClass.new InnerClass();
        OuterClass.InnerClass innerClass2 = new OuterClass().new InnerClass();

        innerClass1.func();

    }
}
